﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed
#pragma once
#include "IRibbonGroup.h"

namespace gcmp
{
    enum class ContextualPageColor;
    class IPageHandler;

    /// \brief page接口,Ribbon上的tab页
    /// \see IRibbon
    FINAL_INTERFACE class GCMP_GUI_MAIN_FRAME_INTERFACE_EXPORT IRibbonPage
    {
    public:
        /// \brief 析构函数
        virtual ~IRibbonPage();

        /// \brief 创建page
        ///
        /// \param id       page的Id，设置page的唯一标识
        /// \param caption    page显示文字
        /// \return  创建出page对象。失败时返回空
        static OwnerPtr<IRibbonPage> Create(const std::wstring& id, const std::wstring& caption);

        /// \brief 添加group至最后
        /// 
        /// \param pGroup    group对象
        /// \return  true表示添加成功，添加时会判断在与已添加的group对象是否Id相同，相同会失败
        virtual bool AddGroup(OwnerPtr<IRibbonGroup> pGroup) = 0;

        /// \brief 插入group
        ///
        /// 插入pGroup至Id为beforeGroupId的group的前面
        /// \param beforeGroupId  被插入group的Id
        /// \param pGroup    将插入的group对象
        /// \return true表示成功，插入时会判断在与已添加的group对象是否Id相同，相同会失败
        virtual bool InsertGroup(const std::wstring& beforeGroupId, OwnerPtr<IRibbonGroup> pGroup) = 0;

        /// \brief 删除group
        ///
        /// \param groupId    将删除的group的id
        /// \return true表示成功， page中没有Id为groupId的group,则返回false
        virtual bool DeleteGroup(const std::wstring& groupId) = 0;

        /// \brief 删除所有group
        ///
        /// \return  true表示成功， false表示失败
        virtual bool DeleteAllGroups() = 0;

        /// \brief 根据group的id在page中找到group对象
        ///
        /// \param groupId group的id
        /// \return 根据Id找到的group对象，page中没有Id为groupId的group,返回空指针
        virtual IRibbonGroup* GetGroup(const std::wstring& groupId) const = 0;

        /// \brief 得到该page上所有的group
        ///
        /// \return group集合
        virtual std::vector<IRibbonGroup*> GetAllGroups() const = 0;

        /// \brief 得到page的Id
        ///
        /// \return 
        virtual std::wstring GetPageId() const = 0;

        /// \brief 得到page在ribbon上显示的文字
        ///
        /// \return
        virtual std::wstring GetCaption() const = 0;

        /// \brief 将该Page设为上下文风格
        ///
        /// \param caption  上下文标题
        /// \param color    上下文颜色
        /// \return true表示成功，false表示失败
        virtual bool SetContextual(const std::wstring& caption, ContextualPageColor color) = 0;

        /// \brief 清除该Page的上下文风格
        ///
        /// \return   true表示成功，false表示失败 
        virtual bool ClearContextual() = 0;

        /// \brief 设置page的可见状态
        ///
        /// \param opPageHandler page控制对象
        /// \return     true表示成功，false表示失败
        virtual bool SetPageHandler(OwnerPtr<IPageHandler> opPageHandler) = 0;

        /// \brief 得到page的可见性
        ///
        /// page的状态由opPageHandler控制，其返回不可见时，page不可见；其返回可见时，page下所有group不可见时，page也不可见，否则可见
        /// \return  返回true表示可见，返回false表示不可见
        virtual bool IsVisible() const = 0;

        /// \brief 得到page的可用性
        ///
        /// page的状态由opPageHandler控制，其返回不可用时，page不可用;
        /// \return  返回true表示可用，返回false表示禁用状态
        virtual bool IsEnabled() const = 0;
    };
}

